package com.xhj.mybatis.builder;


import com.xhj.mybatis.mapping.BoundSql;
import com.xhj.mybatis.mapping.ParameterMapping;
import com.xhj.mybatis.mapping.SqlSource;
import com.xhj.mybatis.session.Configuration;

import java.util.List;

/**
 * StaticSqlSource
 *
 * @author XJks
 * @description TODO:直接持有最终的 SQL 字符串和参数映射。适用于完全静态的 SQL，通常由 RawSqlSource 或 SqlSourceBuilder 生成。
 */
public class StaticSqlSource implements SqlSource {

    /**
     * sql 字符串，表示要执行的 SQL 语句
     */
    private final String sql;

    /**
     * parameterMappings 参数映射列表，描述 SQL 语句中的参数信息
     */
    private final List<ParameterMapping> parameterMappings;

    /**
     * MyBatis 的全局配置对象
     */
    private final Configuration configuration;

    /**
     * 构造方法，接收配置对象和 SQL 语句，不传参数映射时默认为 null
     *
     * @param configuration MyBatis 配置对象
     * @param sql           SQL 语句字符串
     */
    public StaticSqlSource(Configuration configuration, String sql) {
        this(configuration, sql, null);
    }

    /**
     * 构造方法，接收配置对象、SQL 语句和参数映射列表
     *
     * @param configuration     MyBatis 配置对象
     * @param sql               SQL 语句字符串
     * @param parameterMappings 参数映射列表，描述 SQL 语句中的参数信息
     */
    public StaticSqlSource(Configuration configuration, String sql, List<ParameterMapping> parameterMappings) {
        this.sql = sql;
        this.parameterMappings = parameterMappings;
        this.configuration = configuration;
    }

    @Override
    public BoundSql getBoundSql(Object parameterObject) {
        // 创建并返回 BoundSql 实例，传入配置、SQL、参数映射和参数对象
        return new BoundSql(configuration, sql, parameterMappings, parameterObject);
    }

}
